GtkComposeData *compose_data;
GtkComposeTable *retval = NULL;
gunichar codepoint;
+ GString *char_data;
g_return_val_if_fail (compose_list != NULL, NULL);
gtk_compose_seqs = g_new0 (guint16, length * n_index_stride);
+ char_data = g_string_new ("");
+
for (list = compose_list; list != NULL; list = list->next)
{
compose_data = list->data;
gtk_compose_seqs[n++] = (guint16) compose_data->sequence[i];
}
- codepoint = g_utf8_get_char (compose_data->value);
- if (codepoint > 0xffff)
+ if (g_utf8_strlen (compose_data->value, -1) > 1)
{
- gtk_compose_seqs[n++] = codepoint / 0x10000;
- gtk_compose_seqs[n++] = codepoint - codepoint / 0x10000 * 0x10000;
+ if (char_data->len > 0)
+ g_string_append_c (char_data, 0);
+
+ codepoint = char_data->len | (1 << 31);
+
+ g_string_append (char_data, compose_data->value);
}
else
{
- gtk_compose_seqs[n++] = 0;
- gtk_compose_seqs[n++] = codepoint;
+ codepoint = g_utf8_get_char (compose_data->value);
+ g_assert ((codepoint & (1 << 31)) == 0);
}
+
+ gtk_compose_seqs[n++] = (codepoint & 0xffff0000) >> 16;
+ gtk_compose_seqs[n++] = codepoint & 0xffff;
}
retval = g_new0 (GtkComposeTable, 1);
retval->max_seq_len = max_compose_len;
retval->n_seqs = length;
retval->id = hash;
+ retval->n_chars = char_data->len;
+ retval->char_data = g_string_free (char_data, FALSE);
return retval;
}
compose_table->max_seq_len = max_seq_len;
compose_table->n_seqs = n_seqs;
compose_table->id = hash;
+ compose_table->char_data = NULL;
+ compose_table->n_chars = 0;
return g_slist_prepend (compose_tables, compose_table);
}
if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
return compose_tables;
+#if 0
compose_table = gtk_compose_table_load_cache (compose_file);
if (compose_table != NULL)
return g_slist_prepend (compose_tables, compose_table);
+#endif
if ((compose_table = gtk_compose_table_new_with_file (compose_file)) == NULL)
return compose_tables;
+#if 0
gtk_compose_table_save_cache (compose_table);
+#endif
return g_slist_prepend (compose_tables, compose_table);
}
guint16 *next_seq;
gunichar value;
- value = 0x10000 * seq[table->max_seq_len] + seq[table->max_seq_len + 1];
- g_string_append_unichar (output, value);
+ value = (seq[table->max_seq_len] << 16) | seq[table->max_seq_len + 1];
+ if ((value & (1 << 31)) != 0)
+ g_string_append (output, &table->char_data[value & ~(1 << 31)]);
+ else
+ g_string_append_unichar (output, value);
*compose_match = TRUE;